package helper

import (
	"bufio"
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"log"
	"net/http"
	"os"
	"strings"
)

func CurlGet(url string) ([]byte, error) {
	resp, err := http.Get(url)
	if err != nil {
		return nil, fmt.Errorf("failed to send GET request: %v", err)
	}
	defer resp.Body.Close()
	// 读取响应内容
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return nil, fmt.Errorf("failed to read response body: %v", err)
	}
	return body, nil
}

// 定义请求结构体
type CommandData struct {
	CommandUUID string `json:"command_uuid"`
	Comment     string `json:"comment"`
	IP          string `json:"ip"`
	Receive     int    `json:"receive"`
	Send        int    `json:"send"`
}

// PostJSON 函数将 JSON 数据 POST 到指定 URL
func PostJSON(url string, data any) error {
	// 将结构体转换为 JSON 字节切片
	jsonData, err := json.Marshal(data)
	if err != nil {
		return fmt.Errorf("failed to marshal JSON data: %v", err)
	}
	log.Println("POST JSON data:", string(jsonData))
	// 创建 POST 请求
	req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
	if err != nil {
		return fmt.Errorf("failed to create POST request: %v", err)
	}

	// 设置请求头
	req.Header.Set("Content-Type", "application/json")

	// 发送请求
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return fmt.Errorf("failed to send POST request: %v", err)
	}
	defer resp.Body.Close()

	// 检查响应状态码
	if resp.StatusCode < 200 || resp.StatusCode >= 300 {
		return fmt.Errorf("unexpected status code: %d", resp.StatusCode)
	}

	return nil
}

/*--------------------------统计----------------------------*/

// LogStats 包含两个统计结果的结构体
type LogStats struct {
	TotalWithColon int // 包含 "139.159.102.42.12345:" 的行数
	TotalWithArrow int // 包含 "139.159.102.42.12345 >" 的行数
	TotalLines     int // 总行数
	FilePath       string
	Error          error
}

// 统计日志文件中特定字符串出现的行数
func CountLinesInLog(filePath string) LogStats {
	// 初始化结果结构体
	result := LogStats{
		TotalWithColon: 0,
		TotalWithArrow: 0,
		TotalLines:     0,
		FilePath:       filePath,
		Error:          nil,
	}

	// 打开文件
	file, err := os.Open(filePath)
	if err != nil {
		result.Error = fmt.Errorf("无法打开文件: %v", err)
		return result
	}
	defer file.Close()

	// 创建带缓冲的读取器
	scanner := bufio.NewScanner(file)

	// 逐行扫描文件
	for scanner.Scan() {
		line := scanner.Text()
		result.TotalLines++

		// 检查是否包含 "139.159.102.42.12345:"
		if strings.Contains(line, "12345: UDP") {
			result.TotalWithColon++
		}

		// 检查是否包含 "139.159.102.42.12345 >"
		if strings.Contains(line, "12345 >") {
			result.TotalWithArrow++
		}
	}

	// 检查扫描过程中是否有错误
	if err := scanner.Err(); err != nil {
		result.Error = fmt.Errorf("读取文件时出错: %v", err)
	}

	return result
}

// 简单的字符串包含检查函数
func containsSubstring(s, substr string) bool {
	// 使用简单的字符串搜索，也可以使用 strings.Contains
	start := 0
	for {
		pos := findString(s[start:], substr)
		if pos == -1 {
			return false
		}
		if pos == 0 {
			return true
		}
		start += pos + 1
		if start >= len(s) {
			return false
		}
	}
}

// 自定义字符串查找函数
func findString(s, substr string) int {
	if len(substr) == 0 {
		return 0
	}
	if len(substr) > len(s) {
		return -1
	}
	for i := 0; i <= len(s)-len(substr); i++ {
		if s[i:i+len(substr)] == substr {
			return i
		}
	}
	return -1
}

// DeleteFile2 尝试删除指定路径的文件，并返回可能的错误
func DeleteFile2(filePath string) error {
	// 检查文件是否存在
	if _, err := os.Stat(filePath); os.IsNotExist(err) {
		return fmt.Errorf("文件不存在: %s", filePath)
	}

	// 尝试删除文件
	if err := os.Remove(filePath); err != nil {
		return fmt.Errorf("删除文件失败: %v", err)
	}

	return nil
}

type Confirmed struct {
	CommandUuid string `json:"command_uuid"`
	Ip          string `json:"ip"`
}
